1

1.浅拷贝

当把数组或对象简单赋值给其他变量的时候,实际上进行的是浅拷贝,浅拷贝是拷贝引用,只是将拷贝后的引用指向同一个对象实例,彼此间的操作还会互相影响。

分为两种情况:
直接拷贝源对象的引用

var a = { c : 1};
var b = a ;
console.log( a === b);    // true
 a.c = 2 ;
console.log( b.c ); // 2

源对象拷贝实例,但其属性拷贝引用。

var a = [{ c:1 },{d:2} ];
var b = a.slice( );
console.log( a === b ); // false 说明外层数组拷贝的是实例
a[0].c = 3;
console.log( b[0].c ); // 3 //说明元素拷贝是引用

2.深拷贝

在堆中重新分配内存,并且把源对象所有属性都进行新建拷贝,拷贝后的对象与原来的对象完全隔离,互不影响。
如何实现深拷贝?只要递归调用“浅拷贝”就行了。

function deepCopy( p , c ){
    var c = c || {} ;
    for(var i in p){
        If( typeof p[ i ] === “object” ){
            c[ i ] = ( p[ i ].constructor === Array )? [ ] : { };
            deepCopy(p[ i ], c[ i ]);
        }else{
            c[ i ] = p[ i ];
        }
    }

    return c;
}

jquery中的$.extend( )方法可以实现深拷贝,源码原理也是递归使用浅拷贝。
注意ES6的新方法Object.assign( target , obj )实现的是浅拷贝。

3.javascript判断对象是否相等 “==“ ,”==="

对象和数组这种复杂数据类型在判断是否相等时,判断的是二者指向的内存地址是否一致,并不是以是否有相同的属性,属性是否有相同的值为标准。

如,

       var obj1 = {name : ‘Mack’, age : 21};
       var obj2 = {name : ‘Mack’, age : 21};

       console.log(obj1 === obj2); //false
        
       var obj3 = obj1;

       console.log(obj1 === obj3); //true

ES6中的Object.is( )在复杂数据类型的判断机制上和 ‘===’ 是一样的(不同之处只有两个,一个是 +0和-0,第二个是NaN和其本身)。


未末辰降
32 声望0 粉丝

在这做一些学习记录